home *** CD-ROM | disk | FTP | other *** search
- { FormulaBuilder }
- { YGB Software, Inc. }
- { Copyright 1995 Clayton Collie }
- { All rights reserved }
-
- { EIS Demo. Demonstrates the inefficiency }
- { of using the usual methods of variable }
- { handling in cases where variable data }
- { is voluminous and changes frequently }
-
- unit Eis1;
- interface
- uses
- SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
- StdCtrls, Forms, DBCtrls, DB, DBGrids,SSheet,FBCOMP,FBDBCOMP, Grids,
- DBTables, ExtCtrls, Buttons;
-
- type
- TForm2 = class(TForm)
- DBGrid1: TDBGrid;
- DBNavigator: TDBNavigator;
- Panel1: TPanel;
- DataSource1: TDataSource;
- Panel2: TPanel;
- Table1: TTable;
- Panel3: TPanel;
- SSheetGrid: TStringGrid;
- GroupBox1: TGroupBox;
- ResultPanel: TPanel;
- FormulaEdit: TEdit;
- BitBtn1: TBitBtn;
- SpeedButton1: TSpeedButton;
- Expression: TExpression;
- procedure FormCreate(Sender: TObject);
- procedure SSheetGridGetEditText(Sender: TObject; ACol, ARow: Longint;
- var Value: OpenString);
- procedure SSheetGridSetEditText(Sender: TObject; ACol, ARow: Longint;
- const Value: String);
- procedure FormDestroy(Sender: TObject);
- procedure SpeedButton1Click(Sender: TObject);
- procedure DataSource1DataChange(Sender: TObject; Field: TField);
- private
- { private declarations }
- Sheet : TSpreadSheet;
- ExprInitialized : boolean;
- public
- { public declarations }
- Expression : TExpression;
- Procedure AddVariables;
- Procedure UpdateVariables( updateSheetvars : boolean );
- end;
-
- var
- Form2: TForm2;
-
- implementation
- uses fbcalc;
- {$R *.DFM}
- {
- The syntax for "spreadsheet" cell access in RnCn where n is an integer,
- for example :
-
- "R1C1 * R2C2 - R5C2"
- }
-
-
- procedure TForm2.FormCreate(Sender: TObject);
- var r, c : integer;
- tmpstr : String[15];
- begin
- Sheet := TSpreadSheet.Create(NIL);
- ExprInitialized := Expression.Status = EXPR_SUCCESS;
- AddVariables;
- Table1.Open;
- for r := 0 to MAXROWS do
- for c := 0 to MAXCOLS do
- begin
- if (r + c = 0) then continue;
- if (r = 0) then
- begin
- tmpStr := 'C'+IntToStr(c);
- SSheetGrid.Cells[c,r] := tmpstr;
- end
- else
- if (c = 0) then
- begin
- tmpStr := 'R'+IntToStr(r);
- SSheetGrid.Cells[c,r] := tmpstr;
- end
- else
- begin
- tmpstr := FloatToStrF(Sheet.SheetData[r,c],ffCurrency,10,2);
- SSheetGrid.Cells[c,r] := tmpstr;
- end;
- end;
- end;
-
-
-
- Procedure TForm2.AddVariables;
- var r , c : integer;
- tmp : string[10];
- begin
- { Add variables to the engine. Note that since our spreadheet }
- { is 10 x 10, we end up adding a total of 117 variables to ONE }
- { INSTANCE. Even so, there is no guarantee that any one of these }
- { variables will be used. }
- { Imagine, also if we needed to link to another table with a different
- structure }
-
- if ExprInitialized then
- With Expression do begin
- AddVariable('SYMBOL',vtSTRING);
- AddVariable('CO_NAME',vtSTRING);
- AddVariable('CO_NAME',vtSTRING);
- AddVariable('CUR_PRICE',vtFLOAT);
- AddVariable('YRL_HIGH',vtFLOAT);
- AddVariable('YRL_LOW',vtFLOAT);
- AddVariable('P_E_RATIO',vtFLOAT);
- AddVariable('BETA',vtFLOAT);
- AddVariable('PROJ_GRTH',vtFLOAT);
- AddVariable('INDUSTRY',vtINTEGER);
- AddVariable('PRICE_CHG',vtINTEGER);
- AddVariable('SAFETY',vtINTEGER);
- AddVariable('RATING',vtSTRING);
- AddVariable('RANK',vtINTEGER);
- AddVariable('OUTLOOK',vtINTEGER);
- AddVariable('RCMNDATION',vtSTRING);
- AddVariable('RISK',vtSTRING);
- end;
- for r := 1 to MAXROWS do
- for c := 1 to MAXCOLS do
- begin
- tmp := 'R'+IntToStr(R)+'C'+IntToStr(c);
- Expression.AddVariable( tmp, vtFLOAT );
- end;
- end;
-
-
- Procedure TForm2.UpdateVariables( updateSheetVars : Boolean );
- var r,c : word;
- tmp : string[10];
-
- Procedure UpdateVar(const vname : string);
- var tmp : string;
- begin
- tmp := Table1.FieldByName(vname).AsString;
- Expression.StringValues[vname] := tmp;
- end;
-
-
- { Notice that we may end up having to update all 117 variables, even }
- { though we will at most use only a few of them. As you can imagine, }
- { this can be slow }
-
- begin
- UpdateVar('SYMBOL');
- UpdateVar('CO_NAME');
- UpdateVar('CO_NAME');
- UpdateVar('CUR_PRICE');
- UpdateVar('YRL_HIGH');
- UpdateVar('YRL_LOW');
- UpdateVar('P_E_RATIO');
- UpdateVar('BETA');
- UpdateVar('PROJ_GRTH');
- UpdateVar('INDUSTRY');
- UpdateVar('PRICE_CHG');
- UpdateVar('SAFETY');
- UpdateVar('RATING');
- UpdateVar('RANK');
- UpdateVar('OUTLOOK');
- UpdateVar('RCMNDATION');
- UpdateVar('RISK');
-
- { Check to see if we can avoid having to update sheet variables }
- if UpdateSheetVars then
- for r := 1 to MAXROWS do
- for c := 1 to MAXCOLS do
- begin
- tmp := 'R'+IntToStr(R)+'C'+IntToStr(c);
- Expression.StringValues[tmp] := FloatToStr(Sheet.SheetData[r,c]);
- end;
- end;
-
-
-
- procedure TForm2.SSheetGridGetEditText(Sender: TObject; ACol,
- ARow: Longint; var Value: OpenString);
- begin
- Value := FloatToStrF(Sheet.SheetData[ARow,Acol],ffCurrency,10,2);
- end;
-
- procedure TForm2.SSheetGridSetEditText(Sender: TObject; ACol,
- ARow: Longint; const Value: String);
- var temp : double;
- begin
- Try
- Sheet.SheetData[ARow,ACol] := StrToFloat(value);
- except
- {}
- end;
- end;
-
- procedure TForm2.FormDestroy(Sender: TObject);
- begin
- Expression.Free;
- end;
-
- procedure TForm2.SpeedButton1Click(Sender: TObject);
- var stringExpr : String;
- begin
- StringExpr := FormulaEdit.Text;
- if StringExpr <> '' then
- begin
- Expression.Formula := StringExpr;
- if Expression.Status <> EXPR_SUCCESS then
- begin
- MessageBeep( MB_ICONHAND );
- ResultPanel.Caption := Expression.StatusText;
- end
- else
- ResultPanel.Caption := Expression.AsString;
- end;
- end;
-
- procedure TForm2.DataSource1DataChange(Sender: TObject; Field: TField);
- begin
- UpdateVariables( False );
- end;
-
- end.
-